#pragma GCC optimize(2)
#include <iostream>
#include <queue>
#include <map>
#include <unordered_map>
#include <vector>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <set>
#include <unordered_set>
#include <stack>
#include <bitset>
#define F first
#define S second
#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const int N = 1e5+10;
ll w[N];
int e[2*N],ne[2*N],h[N],idx;
int t[N];
ll f[N];
ll g[N];
void add(int a,int b)
{
	e[idx]=b;
	ne[idx]=h[a];
	h[a]=idx++;
}
void init(int n)
{
	idx=0;
	for(int i=1;i<=n;i++) h[i]=-1;
}
void dfs(int u,int fa)
{
	g[u]=w[u];
	ll max1=-1e17,max2=-1e17;
	for(int i=h[u];~i;i=ne[i])
	{
		int j=e[i];
		if(j==fa) continue;
		dfs(j,u);
		g[u]+=f[j]-w[j];
		ll tmp=g[j]-f[j]+w[j];
		if(tmp>max1)
		{
			max2=max1;
			max1=tmp;
		}
		else if(tmp>max2)
		{
			max2=tmp;
		}
	}
	f[u]=g[u];
	for(int i=h[u];~i;i=ne[i])
	{
		int j=e[i];
		if(j==fa) continue;
		f[u]=max(f[u],g[u]+w[j]);
		if(t[j]==3)
		{
			if(max1!=g[j]-f[j]+w[j]) f[u]=max(f[u],g[u]+w[j]+max1);
			else f[u]=max(f[u],g[u]+w[j]+max2);
		}
	}

}
void solve()
{
	int n;
	cin>>n;
	init(n);
	for(int i=1;i<=n;i++) cin>>w[i];
	for(int i=1;i<=n;i++) cin>>t[i];
	for(int i=1;i<n;i++) 
	{
		int a,b;
		cin>>a>>b;
		add(a,b);
		add(b,a);
	}
	dfs(1,-1);
	cout<<f[1]<<'\n';
	
}
int main()
{
	IOS;
	int T=1;
	cin>>T;

	while(T--)
	{
		solve();
	}

	return 0;
}

